コンピュータの構成と設計 第 5 版
https://images-fe.ssl-images-amazon.com/images/I/61vXdBJ3-6L.jpg
https://amzn.to/2yiM9wp
著者 : David A. Patterson、John L. Hennessy
読書開始 : 2019-07-27
読書終了 : 2022-04-17
いわゆるパタヘネ本
インターネット上のコンテンツは http://ec.nikkeibp.co.jp/nsp/09842/index.shtml にあると書かれているが、リンク切れになっている
1. コンピュータの抽象化とテクノロジー
コンピュータは第 3 次産業革命を引き起こした
組み込みコンピュータは、低コストなのに故障の許容率が低いことが多い
消費者向け製品では主として単純化による信頼性の実現
PC にとってかわっているのは PMD
従来のサーバーにとってかわっているのはクラウド・コンピューティング
SaaS によりソフトウェア産業に革命がもたらされている
競争力の高いソフトウェアを開発したいプログラマは、コンピュータの構成方式の知識を増やす必要
プログラムの性能改善や特性の影響評価などをするにあたって、コンピュータアーキテクチャなどの理解が必須
コンピュータアーキテクチャにおける 8 つの主要なアイデア
バイナリ・ディジット (binary digit)、略してビット (bit)
高水準プログラミング言語 (high-level programming language) のおかげで、現代のプログラマは高い生産性を発揮し、精神衛生を保っていられる
抽象化の効果
コンピュータの古典的な 5 つの構成要素
グラフィック・ディスプレイを支える主要ハードウェアはラスター・リフレッシュ・バッファ (フレームバッファ)
プロセッサは大別してデータパス (datapath) と制御 (control) からなる
最も重要な抽象化のひとつ → 命令セット・アーキテクチャ (単にアーキテクチャということもある)
入出力処理やメモリ割当などの低水準のシステム機能は OS によりカプセル化される
ABI : アプリケーションプログラマに提供される基本命令セットとオペレーティング・システム・インターフェイスの組み合わせ
コンピュータ設計者は、アーキテクチャとアーキテクチャの実装方式を区別する
現代においてはコンピュータネットワークも重要
Ethernet がローカルエリアネットワークの代表格
ワイドエリアネットワークがインターネットのバックボーンを形成
エレクトロニクス技術はコンピュータの能力と進歩の礎 → コンピュータ関係の専門家は全員集積回路の基礎を習得すべき
コンピュータの性能評価は挑戦的な課題
ソフトウェアが大規模複雑化しているし、ハードウェアでも様々な性能改善技法が採用されている → 性能評価が難しい
クロック数が急激に伸びる期間が 10 年ほどあったが、電力の壁にぶつかって頭打ちに
プログラム性能を MIPS ではなく秒で計る方が安全なように、エネルギー性能はワットではなくジュールで計る方が良い
電力の壁により、単体プロセッサからマルチプロセッサへと方針転換
コンピュータ処理の性能にとって重要な並列処理はうまく隠蔽されてきたが、ここにきてプログラマが複数プロセッサをうまく扱わなければならなくなった
コンピュータの性能評価の実例
ベンチマーク (benchmark)
SPEC
一般に流布している誤解 (本書では誤信と呼ぶ) を解くための節も設ける
ある面での改善による全体の性能向上は、その改善された機能が使用される割合によって制約される (収穫逓減の法則)
Amdahl の法則で考えると分かる
実行時間 = プログラムの命令実行数 × (クロックサイクル数 / 命令 = CPI) × (秒数 / クロックサイクル)
これがコンピュータの性能を決定する要因
2. 命令 : コンピュータの言葉
コンピュータ言語の言葉を命令 (instruction) と呼び、語彙を命令セット (instruction set) という
本書で使用するのは MIPS Technologies 社のもの
命令の表現法を学ぶことで、コンピュータの本質がプログラム内蔵方式 (stored-program concept) にあることを理解できる
ハードウェアの設計に関する 3 つの基本原則
算術命令のオペランドとしては、レジスタ (register) を使用する
MIPS アーキテクチャではレジスタ長は 32 ビットで、レジスタの数は 32 個
32 ビットをひとまとめにしたものが頻繁に使われるので、それを語 (word) と呼んでいる
レジスタに収まらないデータはメモリ上に置く
レジスタとメモリの間でデータ転送する命令がある (データ転送命令)
一般にメモリからレジスタへの転送をロード、レジスタからメモリへの転送をストアという
メモリ内の語にアクセスするためにはメモリのアドレスを指定
負の値の表現 : 2 の補数 (two's complement)
符号があるので、異なるビット数の間でデータをやり取りする際には符号付き整数としての値として扱うかどうかで処理が変わる (例えばバイトをロードする際には、符号付きかどうかで load byte と load byte unsigned の 2 通りの命令)
コンピュータ内の命令の表現
命令を数値で表したものが機械語 (machine language) で、それらの命令を束ねたものがマシンコード (machine code)
命令は数値として表現され、プログラムはメモリ中にロードしてデータと同様に読み書きできる → プログラム内蔵方式
プログラムカウンタ (PC) : プログラム内蔵方式において、実行中の命令を保持するレジスタ
MIPS におけるプログラムおよびデータのメモリへの割当て
文字の表現 : ASCII や Unicode
並列処理では同期をとらないとデータ競合 (data race) が発生する
同期はユーザーレベルのソフトウェアルーチンが命令を見る
それらはハードウェアのロック命令やアンロック命令を使う
単一のプロセッサのみが操作を行える相互排除 (mutual exclusion) 領域を作れる
システムプログラムが使うためのハードウェア・プリミティブも重要
C 言語のプログラムの翻訳階層
静的なリンクの欠点を克服するために DLL が考案された
実例
ARM の話
Intel x86 の話
ARMv8 の話
命令が強力だと性能が改善されるとは限らない
現在だと人がアセンブリでプログラムを組むよりコンパイラの方が賢い
バイナリ互換性は重要だが、命令セットが変化しないわけではない (x86 には驚くほど命令が追加されている)
3. コンピュータにおける算術演算
MIPS の算術命令には、オーバーフローが起こると例外が起こるものと起こらないものがある
例外を割込みと呼ぶコンピューターもある
nobuoka.icon C ではオーバーフローが起こっても例外が発生しないから、CPU レベルではオーバーフローは認識しないのかと思ってた
MIPS では、乗算や除算のオーバーフローは無視される
SRT 除算 (SRT division) と呼ばれる技法
実数 (real number) 形式
科学記数法 (scientific notation) (2.032×10^2 みたいな、小数点の左側が 1 桁のもの)
先頭に 0 がこないものを正規化数 (normalized number) という
コンピュータで扱う際には、浮動小数点 (floating point) 形式とよぶ (一般形は 1.xxxxx (2 進数) × 2^yyyy という形式)
浮動小数点演算では、オーバーフローだけでなくアンダーフロー (underflow) も発生する
負の指数が大きくなりすぎて表現できない場合 (値が小さくなりすぎて表現できない)
MIPS 専用ではなく、IEEE 754 浮動小数点規格がある
半語並列性 (subword parallelism)
データレベル並列性 (data level parallelism) と呼ばれたり、SIMD と呼ばれることもある
浮動小数点数の並列処理は直列処理と結果が異なりうる
そのような問題を扱う分野が数値解析
4. プロセッサ
命令の多くは似た実行をする → 実装が単純化
MIPS の具体的なデータパスユニットには 2 種類の論理要素
状態論理要素 (state element) : 状態 (state) を記憶する
最低限、入力が 2 つ (書き込む値と書き込むタイミング) と出力が 1 つ
組み合わせ論理要素 (combinational element) : 出力が入力のみによって決まる
クロック方式 (clocking methodology)
本書では、論理的に高い信号をアサートされた (asserted) ものといい、論理的に低い信号をネゲートされた (deasserted) ものという
データパスの構築
トップレベルで必要なデータパス要素
命令を格納し、提供するためのメモリユニット
プログラムカウンタ (PC)
PC を次の命令アドレスに繰り上げる加算器
ALU で構築できる
2 つの違った命令タイプ間でデータパス要素を共有するには、複数入力を接続してマルチプレクサで選択
一番単純な実装は単一クロックサイクル方式 (single-cycle implementation)
現代においてこの方式が採用されることはまずない (効率が悪いため)
パイプライン処理 (pipelining) で、複数命令の実行を同時に進め、スループットを高めて性能改善
命令レベル並列性を上げるには?
バイプラインの段数を増やす
複数命令発行
投機実行
ループ展開 (loop unrolling) でループ性能を改善
現代のディジタル設計 → ハードウェア記述言語と、ライブラリおよび論理合成を用いた記述から詳細なハードウェア設計を生成 (CAD 合成ツールを活用)
5. 容量と速度の両立 : 記憶階層の利用
局所性の法則 (principle of locality) を利用して、記憶装置を記憶階層 (memory hierarchy) の形で実現
局所性の 2 側面
時間的局所性 (temporal locality)
空間的局所性 (spatial locality)
優れた性能を達成するために、記憶階層の仕組みを理解する必要
記憶階層を構成する技術
キャッシュ → メモリキャッシュ
記憶階層の信頼性と可用性
仮想マシン (virtual machine : VM)
ここではシステム仮想マシン (system virtual machine) について考える
仮想記憶 (virtual memory)
ページがいつ置き換えられるかは予知できない → 通常、OS はプロセス作成時にプロセスの全てのページ用の領域をフラッシュメモリかディスク上に確保する (スワップ空間)
アドレス変換バッファ (TLB) によるアドレス変換の高速化
スラッシング
3C モデル
並列処理がある場合、キャッシュ・コヒーレンスの問題がある
6. クライアントからクラウドまでの並列プロセッサ
並列処理プログラムの作成は難しい
問題の規模を固定したまま速度向上比を高めることは、問題の規模を拡大して速度向上比を高めるよりも難しい
強いスケーリング (strong scaling) と弱いスケーリング (weak scaling)
命令流とデータ流の単一・複数によって分類される (1960 年代に提案された分類)
命令流単一・データ流単一 : SISD
命令流複数・データ流単一 : MISD (実例なし)
命令流単一・データ流複数 : SIMD
命令流複数・データ流複数 : MIMD
プログラマの視点で MIMD に似た概念としてハードウェア・マルチスレッディング (hardware multithreading) がある
共有記憶型マルチプロセッサ (shared memory multiprocessor : SMP)
アドレス空間の共有に代わる方法は、各プロセッサが独自の物理アドレス空間を持つこと
この方式では、プロセッサ同士は明示的なメッセージ交換 (message passing) を通じて情報を交換
メッセージ交換型の並列コンピュータとしてはクラスタ (cluster) が最も普及している
ウェアハウス・スケール・コンピュータ
コンピュータゲームがグラフィックス性能向上を刺激
CPU と区別して、GPU あるいはグラフィックス処理ユニットと呼ぶ
ネットワーク
マルチコアプロセッサでは、コア同士を結ぶオンチップネットワークが必要だし、クラスタではサーバー同士をつなぎ合わせるローカルエリアネットワークが必要
いくつかのネットワークトポロジ
リング (ring)
全結合ネットワーク (fully connected network) : リングの対極
全ノードにプロセッサを配置するのではなく、一部のノードにはスイッチのみを配置する方式
スイッチだけのノードは小さいので、高密度に集積 → 性能向上
マルチステージネットワーク (multistage network) という
A. アセンブラ、リンカ、SPIM シミュレータ
SPIM
アセンブリ言語 (assembly language)
リンカ (linker)
TBD
#書籍 #文献